#include <stack>
#include <queue>
#include <string.h>
#include <stdio.h>
#include <QDebug>
#include <iostream>
#include <stack>
#include <string>
#include <sstream>
#include <cmath>

using namespace std;

int prioritize(char op) { //判断优先级
    if (op == '+' || op == '-')
        return 1;
    if (op == '*' || op == '/' || op == '%')
        return 2;
    if (op == '^')
        return 3;
    return 0;
}

string infixToPostfix(string expression) {
    stack<char> operators;//运算符栈
    stringstream postfix;//后续表达式

    for (size_t i = 0;i<expression.size();i++) {
        char c = expression[i];
        if (isdigit(c) || c == '.') {
            if(!isdigit(expression[i+1])&&!(expression[i+1] == '.')){
                postfix <<c;//下一位不是数字
                postfix <<' ';//加入分隔符
                //对数字进行拼接并加入分隔符
            }else{
                postfix <<c;
                //直接拼接到后序表达式
            }
        } else if (c == '(') {
            operators.push(c);//直接入栈
        } else if (c == ')') {
            //从栈弹出操作符，并写入后序表达式，直到遇到'('
            while (!operators.empty() && operators.top() != '(') {
                postfix << operators.top();//加入栈顶元素
                postfix <<' ';//加入分隔符
                operators.pop();
            }
            operators.pop(); //弹出'('
        } else {
            //判断运算符优先级
            //如果该操作符的优先级比栈顶的要高>，那么就入栈；
            //如果该操作符的优先级没有栈顶的高<=，那么栈顶的操作符就出栈进行拼接并加入分隔符
            while (!operators.empty() && prioritize(c) <= prioritize(operators.top())) {
                postfix << operators.top();//加入栈顶元素
                postfix <<' ';//加入分隔符
                operators.pop();
            }
            operators.push(c);//元素入栈
        }
    }

    while (!operators.empty()) {//栈内剩余元素逐一加入后序表达式
        postfix << operators.top();//加入栈顶元素
        postfix <<' ';//加入分隔符
        operators.pop();
    }

    return postfix.str();//返回后序表达式
}


double evaluatePostfix(string expression) {//后序表达式求值操作
    stack<double> operands;

    // 分割逆波兰表达式字符串为各个操作数和运算符
    istringstream iss(expression);//以空格为分隔符将表达式分割
    string token;
    while (iss >> token) {
        // 判断是否为数字
        if (isdigit(token[0]) || (token[0] == '-' && isdigit(token[1]))) {
            // 将字符串转换为对应的数值，并入栈
            double operand = stod(token);//string转换为double并入栈
            operands.push(operand);
        } else {
            // 为运算符，从栈中弹出两个操作数，并进行相应的运算，将结果入栈
            double operand2 = operands.top();
            operands.pop();
            double operand1 = operands.top();
            operands.pop();

            if (token == "+") {
                operands.push(operand1 + operand2);
            } else if (token == "-") {
                operands.push(operand1 - operand2);
            } else if (token == "*") {
                operands.push(operand1 * operand2);
            } else if (token == "/") {
                operands.push(operand1 / operand2);
            } else if (token == "%") {
                operands.push(fmod(operand1, operand2));
            }
        }
    }

    // 返回栈中最后剩下的元素，即为表达式的结果
    return operands.top();
}
double getResultByString(char* infixExpression)
{
    string postfixExpression = infixToPostfix(infixExpression);
    qDebug() << "转化得到的后序表达式: " ;
    qDebug()<< QString::fromStdString( postfixExpression);
    double result = evaluatePostfix(postfixExpression);
    //double result = 111;
    qDebug() << "结果是: " ;
    qDebug() << QString::number(result);
    return result;
}
